package com.qing.demo.netty.server;

import cn.hutool.json.JSONUtil;
import com.alibaba.fastjson.JSON;
import com.qing.demo.netty.domain.TransportProtocol;
import com.qing.demo.netty.domain.User;
import com.qing.demo.netty.service.UserService;
import io.netty.buffer.ByteBuf;
import io.netty.buffer.Unpooled;
import io.netty.channel.ChannelFuture;
import io.netty.channel.ChannelFutureListener;
import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.ChannelInboundHandlerAdapter;
import io.netty.channel.socket.SocketChannel;
import io.netty.handler.codec.http.*;
import io.netty.handler.codec.http.websocketx.*;
import io.netty.util.CharsetUtil;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;


/**
 * @author caozhipeng
 * @date 2025/7/25
 */
@Component
public class MyServerHandler extends ChannelInboundHandlerAdapter {

    private Logger logger= LoggerFactory.getLogger(MyServerHandler.class);


    @Autowired
    private UserService userService;

//   当客户端主动链接后，这个通道就是活跃的，可以发送数据给客户端
    @Override
    public void channelActive(ChannelHandlerContext ctx) throws Exception {
//       当有客户端链接后，添加到ChannelGroup通信组
        SocketChannel socketChannel=(SocketChannel)ctx.channel();
        System.out.println("链接报告开始");
        System.out.println("链接报告信息：有一个客户端链接到本地服务器");
        System.out.println("链接报告IP:"+ socketChannel.localAddress().getHostString());
        System.out.println("链接报告端口:"+ socketChannel.localAddress().getPort());
        System.out.println("链接报告结束");
    }

    /**
     * 当客户端主动断开服务器连接后，这个通道就是不活跃的，不可以传递数据
     * @param ctx
     * @throws Exception
     */
    public void channelInactive(ChannelHandlerContext ctx) throws Exception {
        System.out.println(ctx.channel().id()+" 客户端断开链接");
    }

    // 异常处理
    @Override
    public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception {
        ctx.close();
        System.out.println("异常信息："+cause.getMessage());
    }

    @Override
    public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {
        System.out.println("服务端收到："+ JSONUtil.toJsonStr(msg));

        TransportProtocol transportProtocol= (TransportProtocol) msg;
        userService.save((User) transportProtocol.getObject());
    }

}
